package com.lqk.demo.concurrencytools.threadpool.executors;

import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.concurrent.*;

/**
 * @author lqk
 * @date 2022/1/7 16:21
 *
 * 关闭线程池:
 *  shutdown
 *      线程池状态变为 SHUTDOWN
 *          - 不会接收新任务
 *          - 但已提交任务会执行完
 *          - 此方法不会阻塞调用线程的执行
 *  shutdownNow
 *      线程池状态变为 STOP
 *          - 不会接收新任务
 *          - 会将队列中的任务返回
 *          - 并用 interrupt 的方式中断正在执行的任务
 *  其它方法
 *      // 不在 RUNNING 状态的线程池，此方法就返回 true
 *      boolean isShutdown();
 *      // 线程池状态是否是 TERMINATED
 *      boolean isTerminated();
 *      // 调用 shutdown 后，由于调用线程并不会等待所有任务运行结束，因此如果它想在线程池 TERMINATED 后做些事
 *      情，可以利用此方法等待
 *      boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
 */
@Slf4j
public class TestShutdown {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService pool = Executors.newFixedThreadPool(2);

        Future<Integer> result1 = pool.submit(() -> {
            log.debug("task 1 running...");
            Thread.sleep(1000);
            log.debug("task 1 finish...");
            return 1;
        });

        Future<Integer> result2 = pool.submit(() -> {
            log.debug("task 2 running...");
            Thread.sleep(1000);
            log.debug("task 2 finish...");
            return 2;
        });

        Future<Integer> result3 = pool.submit(() -> {
            log.debug("task 3 running...");
            Thread.sleep(1000);
            log.debug("task 3 finish...");
            return 3;
        });

        log.debug("shutdown");
//        pool.shutdown();
        // 终止超时或者已经进入等待队列的线程执行完就会往下执行
//        pool.awaitTermination(3, TimeUnit.SECONDS);
        // 会将队列中的任务返回, 正在执行并被打断的线程不会返回
        List<Runnable> runnables = pool.shutdownNow();
        log.debug("other.... {}" ,runnables);
    }
}
